• Jump To … +
    zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.js zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.min.js zoo_frontend/node_modules/hoist-non-react-statics/src/index.js zoo_frontend/pages/_app.jsx zoo_frontend/pages/_document.jsx zoo_frontend/pages/admin/delivery-containers/index.js zoo_frontend/pages/admin/department/index.js zoo_frontend/pages/admin/group-diets/index.js zoo_frontend/pages/admin/species/index.js zoo_frontend/pages/admin/user/index.js zoo_frontend/pages/diet/edit.js zoo_frontend/pages/diet/index.js zoo_frontend/pages/diet/new.js zoo_frontend/pages/food/dataSrc.js zoo_frontend/pages/food/edit.js zoo_frontend/pages/food/index.js zoo_frontend/pages/food/new.js zoo_frontend/pages/food/nicknames.js zoo_frontend/pages/food/nutrDef.js zoo_frontend/pages/food/units.js zoo_frontend/pages/home/index.js zoo_frontend/pages/index.jsx zoo_frontend/pages/kitchen/index.js zoo_frontend/pages/kitchen/prep/index.js zoo_frontend/pages/login/index.js zoo_frontend/pages/nutritionist/index.js zoo_frontend/pages/print/bin-label.js zoo_frontend/pages/print/index.js zoo_frontend/pages/print/labels.js zoo_frontend/pages/print/prep-sheet.js zoo_frontend/pages/profile/index.js zoo_frontend/pages/reports/cost-by-gl-code.js zoo_frontend/pages/reports/dept-cards.js zoo_frontend/pages/reports/dept-keeper-cards.js zoo_frontend/pages/reports/feeding-cost.js zoo_frontend/pages/reports/index.js zoo_frontend/pages/reports/prep-cards-table.js zoo_frontend/src/api/Animals.js zoo_frontend/src/api/Api.js zoo_frontend/src/api/BudgetIds.js zoo_frontend/src/api/CaseNotes.js zoo_frontend/src/api/DataSrc.js zoo_frontend/src/api/DeliveryContainers.js zoo_frontend/src/api/Departments.js zoo_frontend/src/api/DietChanges.js zoo_frontend/src/api/DietHistory.js zoo_frontend/src/api/DietPlans.js zoo_frontend/src/api/Diets.js zoo_frontend/src/api/Food.js zoo_frontend/src/api/FoodCategories.js zoo_frontend/src/api/FoodPrepTables.js zoo_frontend/src/api/FoodWeights.js zoo_frontend/src/api/LifeStages.js zoo_frontend/src/api/Locations.js zoo_frontend/src/api/NutData.js zoo_frontend/src/api/NutrDef.js zoo_frontend/src/api/PrepNotes.js zoo_frontend/src/api/RoleMappings.js zoo_frontend/src/api/Roles.js zoo_frontend/src/api/Species.js zoo_frontend/src/api/Subenclosures.js zoo_frontend/src/api/Units.js zoo_frontend/src/api/Users.js zoo_frontend/src/api/index.js zoo_frontend/src/components/ConfirmationDialog.jsx zoo_frontend/src/components/ErrorPage.jsx zoo_frontend/src/components/FormCheckbox.jsx zoo_frontend/src/components/Header.jsx zoo_frontend/src/components/KitchenView.jsx zoo_frontend/src/components/Notifications.jsx zoo_frontend/src/components/PrintPrepSheets/PrepSheetPrintOut.jsx zoo_frontend/src/components/PrintPrepSheets/PrintPrepSheets.jsx zoo_frontend/src/components/PrintPrepSheets/index.js zoo_frontend/src/components/ReactSingleSelect.jsx zoo_frontend/src/components/SidebarDrawer.jsx zoo_frontend/src/components/VirtualTable.jsx zoo_frontend/src/components/index.js zoo_frontend/src/getPageContext.js zoo_frontend/src/pages/PageAccess.js zoo_frontend/src/pages/admin/deliveryContainers/deliveryContainers.jsx zoo_frontend/src/pages/admin/deliveryContainers/deliveryContainers.styles.js zoo_frontend/src/pages/admin/deliveryContainers/index.js zoo_frontend/src/pages/admin/department/department.jsx zoo_frontend/src/pages/admin/department/department.styles.js zoo_frontend/src/pages/admin/department/index.js zoo_frontend/src/pages/admin/groupDiets/groupDiets.jsx zoo_frontend/src/pages/admin/groupDiets/groupDiets.styles.js zoo_frontend/src/pages/admin/groupDiets/index.js zoo_frontend/src/pages/admin/species/index.js zoo_frontend/src/pages/admin/species/species.jsx zoo_frontend/src/pages/admin/species/species.styles.js zoo_frontend/src/pages/admin/user/index.js zoo_frontend/src/pages/admin/user/user.jsx zoo_frontend/src/pages/admin/user/user.styles.js zoo_frontend/src/pages/diet/CaseNotesForm.jsx zoo_frontend/src/pages/diet/CurrentDiet.jsx zoo_frontend/src/pages/diet/DietChangeCard.jsx zoo_frontend/src/pages/diet/DietHistory.jsx zoo_frontend/src/pages/diet/DietPlanChangeDialog.jsx zoo_frontend/src/pages/diet/DietSelectDialog.jsx zoo_frontend/src/pages/diet/diet.jsx zoo_frontend/src/pages/diet/diet.styles.js zoo_frontend/src/pages/diet/dietForm.jsx zoo_frontend/src/pages/diet/dietHistoryList.jsx zoo_frontend/src/pages/diet/edit/edit.jsx zoo_frontend/src/pages/diet/edit/edit.styles.js zoo_frontend/src/pages/diet/edit/index.js zoo_frontend/src/pages/diet/index.js zoo_frontend/src/pages/diet/new/index.js zoo_frontend/src/pages/diet/new/new.jsx zoo_frontend/src/pages/diet/new/new.styles.js zoo_frontend/src/pages/diet/prepNotesForm.jsx zoo_frontend/src/pages/food/dataSrc/dataSrc.jsx zoo_frontend/src/pages/food/dataSrc/dataSrc.styles.js zoo_frontend/src/pages/food/dataSrc/index.js zoo_frontend/src/pages/food/edit/FoodWeightTable.jsx zoo_frontend/src/pages/food/edit/edit.jsx zoo_frontend/src/pages/food/edit/edit.styles.js zoo_frontend/src/pages/food/edit/index.js zoo_frontend/src/pages/food/food.jsx zoo_frontend/src/pages/food/food.styles.js zoo_frontend/src/pages/food/foodForm.jsx zoo_frontend/src/pages/food/index.js zoo_frontend/src/pages/food/new/index.js zoo_frontend/src/pages/food/new/new.jsx zoo_frontend/src/pages/food/new/new.styles.js zoo_frontend/src/pages/food/nicknames/index.js zoo_frontend/src/pages/food/nicknames/nicknames.jsx zoo_frontend/src/pages/food/nicknames/nicknames.styles.js zoo_frontend/src/pages/food/nutrDef/index.js zoo_frontend/src/pages/food/nutrDef/nutrDef.jsx zoo_frontend/src/pages/food/nutrDef/nutrDef.styles.js zoo_frontend/src/pages/food/units/index.js zoo_frontend/src/pages/food/units/units.jsx zoo_frontend/src/pages/food/units/units.styles.js zoo_frontend/src/pages/home/home.jsx zoo_frontend/src/pages/home/home.styles.js zoo_frontend/src/pages/home/index.js zoo_frontend/src/pages/kitchen/index.js zoo_frontend/src/pages/kitchen/kitchenHome.jsx zoo_frontend/src/pages/kitchen/kitchenHome.styles.js zoo_frontend/src/pages/kitchen/prep/index.js zoo_frontend/src/pages/kitchen/prep/kitchen.jsx zoo_frontend/src/pages/kitchen/prep/kitchen.styles.js zoo_frontend/src/pages/login/index.js zoo_frontend/src/pages/login/login.jsx zoo_frontend/src/pages/login/login.styles.js zoo_frontend/src/pages/nutritionist/admin.jsx zoo_frontend/src/pages/nutritionist/admin.styles.js zoo_frontend/src/pages/nutritionist/index.js zoo_frontend/src/pages/print/admin.jsx zoo_frontend/src/pages/print/admin.styles.js zoo_frontend/src/pages/print/bin-label/admin.jsx zoo_frontend/src/pages/print/bin-label/admin.styles.js zoo_frontend/src/pages/print/bin-label/index.js zoo_frontend/src/pages/print/index.js zoo_frontend/src/pages/print/labels/admin.jsx zoo_frontend/src/pages/print/labels/admin.styles.js zoo_frontend/src/pages/print/labels/index.js zoo_frontend/src/pages/print/prep-sheet/admin.jsx zoo_frontend/src/pages/print/prep-sheet/admin.styles.js zoo_frontend/src/pages/print/prep-sheet/index.js zoo_frontend/src/pages/profile/index.js zoo_frontend/src/pages/profile/profile.jsx zoo_frontend/src/pages/profile/profile.styles.js zoo_frontend/src/pages/reports/admin.jsx zoo_frontend/src/pages/reports/admin.styles.js zoo_frontend/src/pages/reports/cost-by-gl-code/admin.jsx zoo_frontend/src/pages/reports/cost-by-gl-code/admin.styles.js zoo_frontend/src/pages/reports/cost-by-gl-code/index.js zoo_frontend/src/pages/reports/dept-cards/admin.jsx zoo_frontend/src/pages/reports/dept-cards/admin.styles.js zoo_frontend/src/pages/reports/dept-cards/index.js zoo_frontend/src/pages/reports/dept-keeper-cards/admin.jsx zoo_frontend/src/pages/reports/dept-keeper-cards/admin.styles.js zoo_frontend/src/pages/reports/dept-keeper-cards/index.js zoo_frontend/src/pages/reports/feeding-cost/admin.jsx zoo_frontend/src/pages/reports/feeding-cost/admin.styles.js zoo_frontend/src/pages/reports/feeding-cost/index.js zoo_frontend/src/pages/reports/index.js zoo_frontend/src/pages/reports/prep-cards-table/admin.jsx zoo_frontend/src/pages/reports/prep-cards-table/admin.styles.js zoo_frontend/src/pages/reports/prep-cards-table/index.js zoo_frontend/src/static/LocalStorage.js zoo_frontend/src/static/Roles.js zoo_frontend/src/util/AuthProvider.jsx zoo_frontend/src/util/PageLayout.jsx zoo_frontend/src/util/TableColumnHelper.js zoo_frontend/src/util/WithPropsChecker.jsx zoo_frontend/src/util/camelToNorm.js zoo_frontend/src/util/withAuth.jsx
  • ReactSingleSelect.jsx

  • ¶
    import React, { useState } from 'react';
    import Select from 'react-select';
    import { withStyles, withTheme } from '@material-ui/core/styles';
    import Typography from '@material-ui/core/Typography';
    import NoSsr from '@material-ui/core/NoSsr';
    import TextField from '@material-ui/core/TextField';
    import Paper from '@material-ui/core/Paper';
    import MenuItem from '@material-ui/core/MenuItem';
    import PropTypes from 'prop-types';
    
    const styles = theme => ({
      input: {
        display: 'flex',
        padding: theme.spacing.unit,
      },
      valueContainer: {
        display: 'flex',
        flexWrap: 'wrap',
        flex: 1,
        alignItems: 'center',
        overflow: 'hidden',
      },
      noOptionsMessage: {
        padding: theme.spacing.unit,
      },
      singleValue: {
        fontSize: 16,
      },
      placeholder: {
        position: 'absolute',
        left: 2,
        fontSize: 16,
      },
      paper: {
        position: 'absolute',
        zIndex: 999,
        marginTop: theme.spacing.unit,
        left: 0,
        right: 0,
      },
      selectedFontColor: {
        color: theme.palette.primary,
      },
      standardFontColor: {
        color: theme.palette.font,
      },
      optionCell: {
        '&:hover': {
          backgroundColor: 'transparent',
        },
      },
    });
    
    const NoOptionsMessage = (props) => (
      <Typography
        color="textSecondary"
        className={props.selectProps.classes.noOptionsMessage}
        {...props.innerProps}
      >
        {props.children}
      </Typography>
    );
    
    NoOptionsMessage.propTypes = {
      selectProps: PropTypes.shape({
        classes: PropTypes.shape({
          noOptionsMessage: PropTypes.string.isRequired,
        }),
      }).isRequired,
      innerProps: PropTypes.object,
      children: PropTypes.string.isRequired,
    };
    
    NoOptionsMessage.defaultProps = {
      innerProps: {},
    };
    
    const inputComponent = ({ inputRef, ...props }) => <div ref={inputRef} {...props} />;
    
    inputComponent.propTypes = {
      inputRef: PropTypes.func.isRequired,
    };
    
    const Control = (props) => (
      <TextField
        id={String(new Date().toTimeString())}
        fullWidth
        InputProps={{
          inputComponent,
          inputProps: {
            className: props.selectProps.classes.input,
            inputRef: props.innerRef,
            children: props.children,
            ...props.innerProps,
          },
        }}
        variant="outlined"
        {...props.selectProps.textFieldProps}
      />
    );
    
    Control.propTypes = {
      selectProps: PropTypes.shape({
        classes: PropTypes.shape({
          input: PropTypes.string.isRequired,
        }),
        textFieldProps: PropTypes.object,
      }).isRequired,
      innerRef: PropTypes.func.isRequired,
      children: PropTypes.array.isRequired,
      innerProps: PropTypes.object,
    };
    
    Control.defaultProps = {
      innerProps: {},
    };
    
    const Option = (props) => (
      <MenuItem
        buttonRef={props.innerRef}
        selected={props.isFocused}
        component="div"
        style={{
          fontWeight: props.isSelected ? 500 : 400,
        }}
        {...props.innerProps}
      >
        {props.children}
      </MenuItem>
    );
    
    Option.propTypes = {
      innerRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
      isFocused: PropTypes.bool.isRequired,
      isSelected: PropTypes.bool.isRequired,
      innerProps: PropTypes.object,
      children: PropTypes.string.isRequired,
    };
    
    Option.defaultProps = {
      innerProps: {},
      innerRef: React.createRef(),
    };
    
    const Placeholder = (props) => (
      <Typography
        color="textSecondary"
        className={props.selectProps.classes.placeholder}
        {...props.innerProps}
      >
        {props.children}
      </Typography>
    );
    
    Placeholder.propTypes = {
      selectProps: PropTypes.shape({
        classes: PropTypes.shape({
          placeholder: PropTypes.string.isRequired,
        }),
        textFieldProps: PropTypes.object,
      }).isRequired,
      children: PropTypes.string.isRequired,
      innerProps: PropTypes.object,
    };
    
    Placeholder.defaultProps = {
      innerProps: {},
    };
    
    const SingleValue = (props) => (
      <Typography className={props.selectProps.classes.singleValue} {...props.innerProps}>
        {props.children}
      </Typography>
    );
    
    SingleValue.propTypes = {
      selectProps: PropTypes.shape({
        classes: PropTypes.shape({
          singleValue: PropTypes.string.isRequired,
        }),
        textFieldProps: PropTypes.object,
      }).isRequired,
      innerProps: PropTypes.object,
      children: PropTypes.string.isRequired,
    };
    
    SingleValue.defaultProps = {
      innerProps: {},
    };
    
    const ValueContainer = (props) => <div className={props.selectProps.classes.valueContainer}>{props.children}</div>;
    
    ValueContainer.propTypes = {
      selectProps: PropTypes.shape({
        classes: PropTypes.shape({
          valueContainer: PropTypes.string.isRequired,
        }),
        textFieldProps: PropTypes.object,
      }).isRequired,
      children: PropTypes.array.isRequired,
    };
    
    const Menu = (props) => (
      <Paper square className={props.selectProps.classes.paper} {...props.innerProps}>
        {props.children}
      </Paper>
    );
    
    Menu.propTypes = {
      selectProps: PropTypes.shape({
        classes: PropTypes.shape({
          paper: PropTypes.string.isRequired,
        }),
      }).isRequired,
      innerProps: PropTypes.object,
      children: PropTypes.object.isRequired,
    };
    
    Menu.defaultProps = {
      innerProps: {},
    };
    
    const components = {
      Control,
      Menu,
      NoOptionsMessage,
      Option,
      Placeholder,
      SingleValue,
      ValueContainer,
    };
    
    const IntegrationReactSelect = (props) => {
      const {
        label, suggestions, onChange, classes, theme, field, form, helperText, error, value, disabled,
      } = props;
      const [selected, setSelected] = useState(false);
    
      function handleChangeSingle(v) {
        if (form) {
          form.setFieldValue(field.name, v.value || null);
        } else {
          onChange(v || { value: null });
        }
      }
    
      const selectStyles = {
        input: base => ({
          ...base,
          color: theme.palette.text.primary,
          '& input': {
            font: 'inherit',
          },
        }),
      };
      return (
        <NoSsr>
          {label &&
            <Typography color={selected ? 'primary' : 'textPrimary'}>
              {label}
            </Typography>
          }
          <Select
            classes={classes}
            styles={selectStyles}
            options={suggestions}
            name={field.name || ''}
            components={components}
  • ¶

    defaultValue={suggestions.find((item) => item.value == defaultValue) || ‘’} // eslint-disable-line eqeqeq

            value={suggestions.find((item) => item.value == value) || ''} // eslint-disable-line eqeqeq
            onChange={handleChangeSingle}
            onFocus={() => {
              setSelected(true);
              if (form) {
                form.setFieldTouched(field.name, true, true);
              }
            }}
            onBlur={() => setSelected(false)}
            id={props.id}
            isDisabled={disabled}
          />
          {(error || helperText) &&
            <Typography color={error ? 'error' : 'textPrimary'}>
              {helperText}
            </Typography>
          }
        </NoSsr>
      );
    };
    
    IntegrationReactSelect.propTypes = {
      suggestions: PropTypes.arrayOf(PropTypes.shape({
        label: PropTypes.string.isRequired,
        value: PropTypes.oneOfType([PropTypes.string.isRequired, PropTypes.number.isRequired]),
      })).isRequired,
      onChange: PropTypes.func,
      value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
      label: PropTypes.string,
      classes: PropTypes.object.isRequired,
      theme: PropTypes.object.isRequired,
      id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
      field: PropTypes.shape({
        name: PropTypes.string,
      }),
      form: PropTypes.object,
      helperText: PropTypes.string,
      error: PropTypes.bool,
      disabled: PropTypes.bool,
    };
    
    IntegrationReactSelect.defaultProps = {
      onChange: () => { },
      value: '',
      label: '',
      id: Math.random(1000),
      field: {},
      form: undefined,
      helperText: '',
      error: false,
      disabled: false,
    };
    
    export default withTheme()(withStyles(styles, { withTheme: true })(IntegrationReactSelect));